/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package expertos;

import DTOs.DTOArticulo;
import DTOs.DTOCliente;
import DTOs.DTOVenta;
import entidadesNegocio.Cliente;
import entidadesNegocio.DetalleVenta;
import entidadesNegocio.Producto;
import entidadesNegocio.Venta;
import excepciones.ExpertoArticuloException;
import excepciones.ExpertoClienteExcepcion;
import excepciones.ExpertoVentaException;
import java.util.Date;
import java.util.List;

import org.hibernate.Criteria;
import org.hibernate.criterion.Expression;
import org.hibernate.criterion.Restrictions;



import persistencia.Fachada;

/**
 *
 * @author eduardo
 */
public class ExpertoVenta extends Experto {

    public List<DetalleVenta> buscarDetallesVentas(DTOVenta dtoVenta) throws ExpertoVentaException {

        List<Venta> ventaEncontrados = null;
        List<DetalleVenta> detallesVentaEncontrados = null;

        if (dtoVenta == null) {

            ventaEncontrados = Fachada.getInstancia().buscar(Venta.class, null);
        } else {
            Criteria criterioVenta = Fachada.getInstancia().crearCriterio(Venta.class);
            if (dtoVenta.getNroVenta() != null) {
                criterioVenta.add(Restrictions.like("nroVenta", dtoVenta.getNroVenta()));
            }
            if ((dtoVenta.getFechaVentaDesde() != null) && (dtoVenta.getFechaVentaHasta() != null)) {
                criterioVenta.add(Expression.between("fechaVenta", (dtoVenta.getFechaVentaDesde()), (dtoVenta.getFechaVentaHasta())));
            }
            ventaEncontrados = Fachada.getInstancia().buscar(Venta.class, criterioVenta);
        }
        if (ventaEncontrados.isEmpty()) {
            throw new ExpertoVentaException("No se encontraron Ventas para los datos ingresados");

        }

        //busco los detalles de la venta, en base al número de venta obtenido en ventaEncontrados



        for (Venta venta : ventaEncontrados) {
            Criteria criterioDetalleVenta = Fachada.getInstancia().crearCriterio(DetalleVenta.class);
            if (venta.getNroventa() != null) {
                criterioDetalleVenta.add(Restrictions.like("venta", venta.getId()));
            }

            detallesVentaEncontrados = Fachada.getInstancia().buscar(DetalleVenta.class, criterioDetalleVenta);

            if (detallesVentaEncontrados.isEmpty()) {
                throw new ExpertoVentaException("No se encontraron Detalles para la Venta ingresada");

            }

        }

        return detallesVentaEncontrados;


    }


    public List<Cliente> buscarClientes (DTOCliente dtocliente) throws ExpertoClienteExcepcion{

        List<Cliente> clientesEncontrados = null;

        if(dtocliente == null){

            clientesEncontrados = Fachada.getInstancia().buscar(Cliente.class, null);
        }else {
            Criteria criterioCliente = Fachada.getInstancia().crearCriterio(Cliente.class);
            if(dtocliente.getNrocliente() != null){
                criterioCliente.add(Restrictions.like("codigoCliente", dtocliente.getNrocliente()));
            }
            if (dtocliente.getNombreCliente() != null){
                criterioCliente.add(Restrictions.like("nombreCliente", "%" + dtocliente.getNombreCliente() + "%").ignoreCase());
            }
            clientesEncontrados = Fachada.getInstancia().buscar(Cliente.class, criterioCliente);
        }
        if (clientesEncontrados.isEmpty()) {
            throw new ExpertoClienteExcepcion("No se encontraron clientes para los datos ingresados");

        }

    return clientesEncontrados;
    }


    public List<Producto> buscarArticulos(DTOArticulo dtoArticulo) throws ExpertoArticuloException {

        List<Producto> articulosEncontrados = null;

        if (dtoArticulo == null) {

            articulosEncontrados = Fachada.getInstancia().buscar(Producto.class, null);
        } else {
            Criteria criterioProducto = Fachada.getInstancia().crearCriterio(Producto.class);
            if (dtoArticulo.getCodigoProducto() != null) {
                criterioProducto.add(Restrictions.like("codigoProducto", dtoArticulo.getCodigoProducto()));
            }
            if (dtoArticulo.getNombreProducto() != null) {
                criterioProducto.add(Restrictions.like("nombreProducto", "%" + dtoArticulo.getNombreProducto() + "%").ignoreCase());
            }
            articulosEncontrados = Fachada.getInstancia().buscar(Producto.class, criterioProducto);
        }
        if (articulosEncontrados.isEmpty()) {
            throw new ExpertoArticuloException("No se encontraron Productos para los datos ingresados");

        }

        return articulosEncontrados;
    }




public void guardar(Venta venta) throws ExpertoVentaException{
        if (ventaInvalido(venta)) {
            throw new ExpertoVentaException("Faltan completar Campos");
        }else{

        try {
            Fachada.getInstancia().guardar(venta);
        } catch (Exception ex) {
            throw new ExpertoVentaException("Error al guardar la Venta");
        }
        }
    }

public void guardar(DetalleVenta detalleVenta) throws ExpertoVentaException{
        if (detalleVentaInvalido(detalleVenta)) {
            throw new ExpertoVentaException("Faltan completar Campos");
        }else{

        try {
            Fachada.getInstancia().guardar(detalleVenta);
        } catch (Exception ex) {
            throw new ExpertoVentaException("Error al guardar Los Detalles de Venta");
        }
        }
    }


 private boolean ventaInvalido(Venta venta) {
        if (venta.getNroventa().length() == 0) {
            return true;
        }else {
            return false;
        }

    }

 private boolean detalleVentaInvalido(DetalleVenta detalleVenta) {
        if (detalleVenta.getPreciounitariodetalleventa() == 0) {
            return true;
        }else {
            return false;
        }

    }


    /* public List<ABC> buscarABC() {
    List<ABC> abcEncontrada = null;

    abcEncontrada = Fachada.getInstancia().buscar(ABC.class, null);

    return abcEncontrada;

    }*/
    /*public void guardar(Producto producto) throws ExpertoArticuloException {
    if (articuloInvalida(producto)) {
    throw new ExpertoArticuloException("Faltan completar Campos");
    } else {

    try {
    Fachada.getInstancia().guardar(producto);
    } catch (Exception ex) {
    throw new ExpertoArticuloException("Error al guardar el Artículo");
    }
    }
    }

    public void eliminar(Producto producto) throws ExpertoArticuloException {
    producto.setEliminado(true);

    try {
    Fachada.getInstancia().guardar(producto);

    } catch (Exception ex) {
    throw new ExpertoArticuloException("Error al eliminar el Artículo");
    }


    }*/
    /*private boolean articuloInvalida(Producto nuevaArticulo) {
    if (nuevaArticulo.getCodigoProducto().length() == 0) {
    return true;
    } else if (nuevaArticulo.getNombreProducto().length() == 0) {
    return true;
    } else {
    return false;
    }
    }*/
}
